#include "optionwidget.h"
#include "ui_optionwidget.h"
#include <QLabel>
#include <QDebug>
#include <QTextCodec>

OptionWidget::OptionWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::OptionWidget)
{
    QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));//ISO8859-2
    ui->setupUi(this);
    ui->roadColorComboBox->addItem("żółty");
    _numBranches = 2;
    _numRails = 0;
    setBranches(2);
    //connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(wyswietlOptionWidget()));
}

OptionWidget::~OptionWidget()
{
    delete ui;
}

void OptionWidget::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

//! żeby przechwycić sygnał podczas ustawiania zależności należy użyć sygnału void QComboBox::currentIndexChanged ( const QString & text )
//! i ten tekst jest przekazywany do własnego slotu: dependenceChanged(const QString & text)
//! została zmieniona wartość w zależnościach ulic
//! sprawdzam czy wśród wszystki zależności są dwie pod rząd sklejone, jeśli tak, w następnej usuwam możliwość sklejenia
void OptionWidget::dependenceChanged(const QString & text)
{
    int nastepny, dalszy; //nastepny = i+1, dalszy i+2
    qDebug() << "wewnatrz slotu"<< endl;
    if (_numBranches >=3)
    {
        for (int i = 0; i<_numBranches; i++)
        {
            if (i+1<_numBranches)
            {
                nastepny = i+1;
                if (i+2<_numBranches) dalszy = i+2;
                else dalszy = 0;
            }
            else
            {
                nastepny = 0;
                dalszy = 1;
            }

            qDebug() << "nastepny"<< nastepny << endl;
            qDebug() << "dalszy"<< dalszy << endl;
            //tutaj usuwam sklejony jeśli niepotrzebny
            if (((zaleznosc[i]->currentText() == (QString)tr("sklejona")) && (zaleznosc[i]->currentText() == zaleznosc[nastepny]->currentText()) ))
            {
                qDebug() << "w ifie"<< endl;
                zaleznosc[dalszy]->removeItem(2);
            }
            //tutaj dodaje w razie potrzeby
            if ((zaleznosc[dalszy]->count() < 3) && ((zaleznosc[i]->currentText() != (QString)tr("sklejona")) || (zaleznosc[nastepny]->currentText() != (QString)tr("sklejona"))))
                zaleznosc[dalszy]->addItem((QString)tr("sklejona"));
        }
    }
    qDebug() << "koniec slotu"<< endl;
}

//! Tworzy dynamicznie kolejne wiersze opisujące gałęzie
void OptionWidget::on_numBranchesSpinBox_valueChanged(int numBranches)
{
    QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));
    //1. wyczyć ulice
    qDebug() << "przed czyszczeniem" << endl;
    OptionWidget::clearBranches();

    //2. stwórz elementy i dodaj je do "tabeli"
    setBranches(numBranches);
}

//! czyści poprzednia ilosc i ustawienia gałęzi
void OptionWidget::clearBranches()
{

    for (int i=0; i<_numBranches; i++)
    {
        zaleznosc[i]->disconnect();
        delete liczebnik[i];
        delete wjazd[i];
        delete liczbaPasow[i];
        delete katOdchylenia[i];
        delete zaleznosc[i];
        delete liczebnik2[i];

    }
    delete [] liczebnik;
    delete [] wjazd;
    delete [] liczbaPasow;
    delete [] katOdchylenia;
    delete [] zaleznosc;
    delete [] liczebnik2;
}
//! ustawienia gałęzi po "oczyszczeniu"
void OptionWidget::setBranches(int numBranches)
{
    _numBranches = numBranches;
    liczebnik = new QLabel*[numBranches];
    wjazd = new QComboBox*[numBranches];
    liczbaPasow = new QSpinBox*[numBranches];
    katOdchylenia = new QDial*[numBranches];
    zaleznosc = new QComboBox*[numBranches];
    liczebnik2 = new QLabel*[numBranches];
    //tworze kolejne linijki w tabeli - dynamiczne tworzenie opcji ulic
    for (int i=0; i< numBranches; i++)
    {
        qDebug() << "weszlam w petla" << endl;
        liczebnik[i] = new QLabel(tr("Gałąź: ")+QString::number(double(i+1)));
        wjazd[i] = new QComboBox();
        wjazd[i]->addItem(tr("wjazd"));
        wjazd[i]->addItem(tr("zjazd"));
        liczbaPasow[i] = new QSpinBox();
        liczbaPasow[i]->setRange(1,7);
        katOdchylenia[i] = new QDial();
        katOdchylenia[i]->setRange(0, 180);
        if ((i+1) == numBranches) //czyli ostatni
            liczebnik2[i] = new QLabel(tr(" z gałęzią ")+QString::number(double(1)));
        else
            liczebnik2[i] = new QLabel(tr(" z gałęzią ")+QString::number(double(i+2)));
        zaleznosc[i] = new QComboBox();
        zaleznosc[i]->addItem((QString)tr("rozłączona"));
        zaleznosc[i]->addItem((QString)tr("połączona"));
        zaleznosc[i]->addItem((QString)tr("sklejona"));
        connect(zaleznosc[i], SIGNAL(currentIndexChanged(QString)), this, SLOT(dependenceChanged(QString)));
        qDebug() << "polaczylam"<< endl;

        //dodanie do tabeli
        ui->branchesGridLayout->addWidget(liczebnik[i], i+1, 0);
        ui->branchesGridLayout->addWidget(wjazd[i], i+1, 1);
        ui->branchesGridLayout->addWidget(liczbaPasow[i], i+1, 2);
        ui->branchesGridLayout->addWidget(katOdchylenia[i], i+1, 3);
        ui->branchesGridLayout->addWidget(zaleznosc[i], i+1, 4);
        ui->branchesGridLayout->addWidget(liczebnik2[i], i+1, 5);
    }
    //
}

void OptionWidget::on_numRailsSpinBox_valueChanged(int numRails)
{
    //1. wyczyszczenie opcji, jesli jakieś są ustawione
    if (_numRails) clearRails();
    //2. Storzenie elementów wiersza i ich ustawienie
    setRails(numRails);
}

void OptionWidget::setRails(int numRails)
{
    _numRails = numRails;
    toryLiczebnik = new QLabel* [numRails] ;
    torySkad = new QComboBox* [numRails] ;
    toryDokad = new QComboBox* [numRails];
    toryPodlozeSkad = new QComboBox* [numRails];
    toryPodlozeDokad = new QComboBox* [numRails] ;
    for (int i = 0; i<numRails; i++)
    {
        toryLiczebnik[i] = new QLabel(tr("torowisko ")+QString::number(double(i+1)));
        torySkad[i] = new QComboBox();
        for (int j=0; j<_numBranches; j++)
            torySkad[i]->addItem(QString::number(double(j+1))); //zamiast tej petli można wykorzystać liste i funkcje AddItems()
        toryDokad[i] = new QComboBox();
        for (int j=0; j<_numBranches; j++)
            toryDokad[i]->addItem(QString::number(double(j+1)));
        toryPodlozeSkad[i] = new QComboBox();
        toryPodlozeSkad[i]->addItem(tr("trawa"));
        toryPodlozeSkad[i]->addItem(tr("jezdnia"));
        toryPodlozeDokad[i] = new QComboBox();
        toryPodlozeDokad[i]->addItem(tr("trawa"));
        toryPodlozeDokad[i]->addItem(tr("jezdnia"));

        ui->railsGridLayout->addWidget(toryLiczebnik[i], i+2, 0);
        ui->railsGridLayout->addWidget(torySkad[i], i+2, 1);
        ui->railsGridLayout->addWidget(toryPodlozeSkad[i], i+2, 3);
        ui->railsGridLayout->addWidget(toryDokad[i], i+2, 5);
        ui->railsGridLayout->addWidget(toryPodlozeDokad[i], i+2, 7);
    }

}

void OptionWidget::clearRails()
{
    for (int i=0; i<_numRails; i++)
    {
        delete toryLiczebnik[i];
        delete torySkad[i];
        delete toryDokad[i];
        delete toryPodlozeSkad[i];
        delete toryPodlozeDokad[i];
    }
    delete [] toryLiczebnik;
    delete [] torySkad;
    delete [] toryDokad;
    delete [] toryPodlozeDokad;
    delete [] toryPodlozeSkad;
}
